package sifeap.pl.managedbean.solicitudescredito;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import sifeap.bl.ejb.solicitudescredito.SolicitudCreditoBLLocal;
import sifeap.entities.solicitudescredito.EstadoCredito;
import sifeap.entities.solicitudescredito.SolicitudCredito;
import sifeap.entities.solicitudescredito.valueobject.SolicitudCreditoVO;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.managedbean.usuarios.LoginManagedBean;
import sifeap.pl.managedbean.usuarios.MenuUsuarioManagedBean;
import sifeap.pl.util.FacesUtils;

@ManagedBean(name="misSolicitudesCreditoManagedBean")
@SessionScoped
public class MisSolicitudesCreditoManagedBean {
	private SolicitudCreditoVO solicitudCreditoVo;
	private List<SolicitudCredito> listaSolicitudes;
	
	private SolicitudCredito solicitudCreditoSeleccionada;
	
	private int accion;
	
	private final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";
	
	@EJB
	SolicitudCreditoBLLocal solicitudCreditoBL;
	
	@PostConstruct
	public void inicializar() {
		//Se inicializan los datos
		cargarDatosPredeterminados();
		buscar();
	}
	
	public List<SelectItem> getItemsEstadosCredito() {
		List<EstadoCredito> listaEstadoCredito = null;
		try {
			listaEstadoCredito = solicitudCreditoBL.buscarEstadosCredito();
		} catch (SifeapException e) {
			e.printStackTrace();
		}
		
		List <SelectItem> itemsEstadosCredito = new ArrayList<SelectItem>();
		if (listaEstadoCredito != null) {
			for (EstadoCredito estadoCredito : listaEstadoCredito) {
				itemsEstadosCredito.add(new SelectItem(estadoCredito.getIdEstadoCredito(), estadoCredito.getNombre()));
			}
		}
		return itemsEstadosCredito;
	}
	
	public Boolean getMostrarResultados() {
		if (listaSolicitudes != null && listaSolicitudes.size() > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	public List<SolicitudCredito> getListaSolicitudes() {
		return listaSolicitudes;
	}
	
	public void setListaSolicitudes(List<SolicitudCredito> listaSolicitudes) {
		this.listaSolicitudes = listaSolicitudes;
	}

	public SolicitudCreditoVO getSolicitudCreditoVo() {
		return solicitudCreditoVo;
	}

	public void setSolicitudCreditoVo(SolicitudCreditoVO solicitudCreditoVo) {
		this.solicitudCreditoVo = solicitudCreditoVo;
	}
	
	public SolicitudCredito getSolicitudCreditoSeleccionada() {
		return solicitudCreditoSeleccionada;
	}

	public void setSolicitudCreditoSeleccionada(SolicitudCredito solicitudCreditoSeleccionada) {
		this.solicitudCreditoSeleccionada = solicitudCreditoSeleccionada;
	}
	
	public int getAccion() {
		return accion;
	}

	public void setAccion(int accion) {
		this.accion = accion;
	}
	
	private void cargarDatosPredeterminados() {
		setSolicitudCreditoVo(new SolicitudCreditoVO());
		getSolicitudCreditoVo().setSolicitudCredito(new SolicitudCredito());
		getSolicitudCreditoVo().getSolicitudCredito().setEstadoscredito(new EstadoCredito());
	}
	
	private void buscar() {
		UsuarioVO usuario = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
		getSolicitudCreditoVo().getSolicitudCredito().setVincedula(usuario.getUsuario().getNombreUsuario());
		
		try {
			listaSolicitudes = solicitudCreditoBL.buscarMisSolicitudes(getSolicitudCreditoVo());
			
			if (!(listaSolicitudes != null && !listaSolicitudes.isEmpty())) {
				FacesUtils.addWarnMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.consultar.sinresultado"), false);
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.consultar.error"), false);
			} catch (SifeapException e1) {}
		}
	}
	
	private void limpiarCampos() {
		cargarDatosPredeterminados();
		buscar();
	}
	
	public void consultar() {
		//Ejecuta la consulta
		buscar();
	}
	
	public String limpiar() {
		limpiarCampos();
		return "/web/solicitudesCredito/misSolicitudes.jsf?faces-redirect=true";
	}
	
	public String cargarEditar() {
		//Eliminar managedBean de sesion
		String[] managedBeans = {"consultarSolicitudesCreditoManagedBean", "solicitudCreditoManagedBean"};
		MenuUsuarioManagedBean.eliminarManagedBean(managedBeans);
		
		String idSolicitud = FacesUtils.getRequestParameter("p_idsolicitud_edit");
		
		try {
			if (idSolicitud != null) {
				setAccion(SolicitudCreditoVO.ACCION_MODIFICAR);
				setSolicitudCreditoSeleccionada(solicitudCreditoBL.buscar(new Long(idSolicitud)));
			} else {
				return "";
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.consultar.error"), false);
			} catch (SifeapException e1) {}
			return "";
		}
		
		return "/web/solicitudesCredito/solicitudCredito.jsf?faces-redirect=true";
	}
	
	public void cargarCancelarSolicitud() {
		String idSolicitud = FacesUtils.getRequestParameter("p_idsolicitud_canc");
		
		try {
			if (idSolicitud != null) {
				setAccion(SolicitudCreditoVO.ACCION_MODIFICAR);
				setSolicitudCreditoSeleccionada(solicitudCreditoBL.buscar(new Long(idSolicitud)));
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.cancelar.error"), false);
			} catch (SifeapException e1) {}
		}
	}
	
	public void cargarEnviarEstudio() {
		String idSolicitud = FacesUtils.getRequestParameter("p_idsolicitud_env");
		
		try {
			if (idSolicitud != null) {
				setAccion(SolicitudCreditoVO.ACCION_MODIFICAR);
				setSolicitudCreditoSeleccionada(solicitudCreditoBL.buscar(new Long(idSolicitud)));
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.enviarestudio.error"), false);
			} catch (SifeapException e1) {}
		}
	}
	
	public void cancelarSolicitud() {
		try {
			boolean resultado = solicitudCreditoBL.cambiarEstadoSolicitud(getSolicitudCreditoSeleccionada().getIdSolicitudCredito(), SolicitudCreditoVO.ESTADO_CREDITO_CANCELADO, null);
			
			if (resultado) {
				buscar();
				FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.cancelar.exito"), false);
			}
		} catch (SifeapException e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.cancelar.error"), false);
			} catch (Exception e1) {}
			e.printStackTrace();
		}
		
	}
	
	public String cancelar(){
		setAccion(SolicitudCreditoVO.ACCION_CREAR);
		setSolicitudCreditoSeleccionada(null);
		return "";
	}
	
	public String cargarDetalle() {
		//Eliminar managedBean de sesion
		String[] managedBeans = {"consultarSolicitudesCreditoManagedBean", "solicitudCreditoManagedBean"};
		MenuUsuarioManagedBean.eliminarManagedBean(managedBeans);
		
		String idSolicitud = FacesUtils.getRequestParameter("p_idsolicitud_det");
		
		try {
			if (idSolicitud != null) {
				setAccion(SolicitudCreditoVO.ACCION_DETALLE_MIS_SOLICITUDES);
				setSolicitudCreditoSeleccionada(solicitudCreditoBL.buscar(new Long(idSolicitud)));
			} else {
				return "";
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.consultar.error"), false);
			} catch (SifeapException e1) {}
			return "";
		}
		
		return "/web/solicitudesCredito/solicitudCredito.jsf?faces-redirect=true";
	}
	
	public void enviarSolicitud() {
		try {
			//Debe validar los motos solicitados
			byte respuesta = solicitudCreditoBL.validarMontoSolicitado(getSolicitudCreditoSeleccionada(), null);
			switch (respuesta) {
				case 1:
					//Exitoso (No hace nada)
					break;
				case 2:
					try {
						FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.escogercodeudor"), false);
						return;
					} catch (Exception e) {
						e.printStackTrace();
					}
					break;
				case 3:
					try {
						FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.escogergarantia"), false);
						return;
					} catch (Exception e) {
						e.printStackTrace();
					}
					break;
				default:
					break;
			}
			
			boolean resultado = solicitudCreditoBL.cambiarEstadoSolicitud(getSolicitudCreditoSeleccionada().getIdSolicitudCredito(), SolicitudCreditoVO.ESTADO_CREDITO_EN_ESTUDIO, null);
			
			if (resultado) {
				buscar();
				FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.enviarestudio.exito"), false);
			}
		} catch (SifeapException e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.missolicitudescredito.enviarestudio.error"), false);
			} catch (Exception e1) {}
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Verifica si para el usuario autenticado tiene los permisos solicitados
	 * @return
	 */
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("mis_creditos:consultar");
	}
}
